package ru.emms.codemeter.tables;

import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: nastya.kuz
 * Date: 29.07.2010
 * Time: 17:29:51
 * Расширение интерфейса стандартного класса javax.swing.table.JTableHeader
 * добавляет методы, облегчающие обращение к классу ColumnGroup
 */
public class GroupableTableHeader
        extends JTableHeader {

    private ArrayList<ColumnGroup> columnGroups;

    public GroupableTableHeader(TableColumnModel model) {
        super(model);
        setUI(new GroupableTableHeaderUI());
        setReorderingAllowed(false);
    }

    public void updateUI() {
        setUI(new GroupableTableHeaderUI());
    }

    /**
     * Запрещается перестановка столбцов таблицы. независимо от параметра
     *
     * @param flag параметр
     */
    public void setReorderingAllowed(boolean flag) {
        reorderingAllowed = false;
    }

    /**
     * Добавляет переданную группу солбцов к таблице
     *
     * @param group Добавляемая группа
     */
    public void addColumnGroup(ColumnGroup group) {
        if(columnGroups == null) {
            columnGroups = new ArrayList<ColumnGroup>();
        }
        columnGroups.add(group);
    }

    /**
     * Определяет список групп в которых содержится столбец tableColumn
     *
     * @param tableColumn столбец
     *
     * @return Возвращает итератор для списка групп,
     *         или null, если список групп пуст или столбца там нет
     */
    public Iterator getColumnGroups(TableColumn tableColumn) {
        if(columnGroups != null) {
            for (ColumnGroup columnGroup : columnGroups) {
                //ищем группу, в которой находится данный столбец (проверяем все подгруппы columnGroup)
                List resultColumnGroup = columnGroup.getColumnGroups(tableColumn, new ArrayList<ColumnGroup>());
                if(resultColumnGroup != null) {
                    return resultColumnGroup.iterator();
                }
            }
        }
        return null;
    }

    /**
     * устанавливает расстояние между ячейками для текущей TableColumnModel
     */
    public void setColumnMargin() {
        if(columnGroups == null) {
            return;
        }
        int columnMargin = getColumnModel().getColumnMargin();
        for (ColumnGroup columnGroup : columnGroups) {
            columnGroup.setColumnMargin(columnMargin);
        }
    }

}